1T_Pandas Basic (1) - 데이터 추가하기 ( pd.concat, df.append )

  • Pandas DataFarme 합치고 추가하기 (append / concat)
  • 서울시의 데이터프레임과 부산시의 데이터프레임은 전혀 상관이 없었던 것을 합쳤었던거야. => Row 합치기에 해당
  • 합치는 기준이 따로 있어. row 기준 따로 있고 Column 기준이 따로 있어.
    1. Row를 기준으로 df를 합치는 것 - append, concat
    1. Column을 기준으로 df를 합치는 것 - concat(... , axis=1)
  • Row 합치기부터
  • Df, Df2 합치기. append, concat 기능을 사용할 것이다.
  • 2개의 회사로 가정해보자

In [12]:
a_df = pd.DataFrame([
        {
            "Name": "A 회사 직원 (1)",
            "Age": 30,
        },
        {
            "Name": "A 회사 직원 (2)",
            "Age": 29,
        }
    ])

b_df = pd.DataFrame([
        {
            "Name": "B 회사 직원 (1)",
            "Age": 33,
        },
        {
            "Name": "B 회사 직원 (2)",
            "Age": 26,
        }
    ])

In [5]:
a_df


Out[5]:
Age Name
0 30 A 회사 직원 (1)
1 29 A 회사 직원 (2)

A와 B 회사가 합병해서 하나의 DF으로 만들자.


In [6]:
a_df + b_df    # Matrix Sum 과 유사하게 합쳐진다. (행렬합처럼)


Out[6]:
Age Name
0 63 A 회사 직원 (1)B 회사 직원 (1)
1 55 A 회사 직원 (2)B 회사 직원 (2)
    1. append 2. concat 이 있어.
    1. append 우선 이것부터

In [8]:
together_df = pd.DataFrame(columns=["Name", "Age"])
# for문을 돌리면서 together_df.loc[len(together_Df)] ...

In [7]:
a_df.append(b_df)


Out[7]:
Age Name
0 30 A 회사 직원 (1)
1 29 A 회사 직원 (2)
0 33 B 회사 직원 (1)
1 26 B 회사 직원 (2)

In [9]:
a_df


Out[9]:
Age Name
0 30 A 회사 직원 (1)
1 29 A 회사 직원 (2)

In [13]:
ab_df = a_df.append(b_df)   #이렇게 하면 inplace로 바꿀 수 있다.

In [15]:
ab_df.loc[0]  #2개가 나와 버린다. 인덱스가 중복되었기 때문


Out[15]:
Age Name
0 30 A 회사 직원 (1)
0 33 B 회사 직원 (1)

In [17]:
# 1. 번외로 index가 중복 되었을 때 해결하는 방법!
ab_df.reset_index()


Out[17]:
index Age Name
0 0 30 A 회사 직원 (1)
1 1 29 A 회사 직원 (2)
2 0 33 B 회사 직원 (1)
3 1 26 B 회사 직원 (2)

In [18]:
a_df["Age"]   #Series  => 특정 Column 하나만 가져오는 애


Out[18]:
0    30
1    29
Name: Age, dtype: int64

In [19]:
a_df[["Age"]]   #리스트를 받으면. DataFrame => 특정 Columns들만 가져오는 애


Out[19]:
Age
0 30
1 29

In [24]:
ab_df.reset_index()[["Name", "Age"]]   #이렇게 해도 되지만 번거롭다.


Out[24]:
Name Age
0 A 회사 직원 (1) 30
1 A 회사 직원 (2) 29
2 B 회사 직원 (1) 33
3 B 회사 직원 (2) 26

In [27]:
ab_df.reset_index(drop=True)


Out[27]:
Age Name
0 30 A 회사 직원 (1)
1 29 A 회사 직원 (2)
2 33 B 회사 직원 (1)
3 26 B 회사 직원 (2)

In [28]:
ab_df.reset_index(drop=True, inplace=True)   #이거 명령어 추가하면 원본 데이터가 변경된다.


Out[28]:
Age Name
0 30 A 회사 직원 (1)
1 29 A 회사 직원 (2)
0 33 B 회사 직원 (1)
1 26 B 회사 직원 (2)

pd.concat


In [31]:
pd.concat([a_df, b_df])


Out[31]:
Age Name
0 30 A 회사 직원 (1)
1 29 A 회사 직원 (2)
0 33 B 회사 직원 (1)
1 26 B 회사 직원 (2)

In [32]:
ab_df = pd.concat([a_df, b_df]).reset_index(drop=True)

In [33]:
ab_df


Out[33]:
Age Name
0 30 A 회사 직원 (1)
1 29 A 회사 직원 (2)
2 33 B 회사 직원 (1)
3 26 B 회사 직원 (2)
  • 카카오(A)와 다음(B) 합병 했는데 누가 어디 출신인지 알고 싶다.

In [37]:
a_df["Company"] = "KaKao"
b_df["Company"] = "Daum"
ab_df = pd.concat([a_df, b_df])
ab_df


Out[37]:
Age Name Company
0 30 A 회사 직원 (1) KaKao
1 29 A 회사 직원 (2) KaKao
0 33 B 회사 직원 (1) Daum
1 26 B 회사 직원 (2) Daum

In [38]:
# 카카오에 다녔던 친구를 뽑고 싶습니다.
# 칼럼의 값을 비교해서 True/False series를 만들고 원본 데이터프레임에서 시리즈의 값이 True인 친구만 뽑는다.(행렬곱)

In [39]:
is_kakao = ab_df["Company"] == "KaKao"
is_kakao


Out[39]:
0     True
1     True
0    False
1    False
Name: Company, dtype: bool

In [42]:
ab_df[is_kakao]   #지금은 Series로 들어갔다.


Out[42]:
Age Name Company
0 30 A 회사 직원 (1) KaKao
1 29 A 회사 직원 (2) KaKao
  • df[STR] => 그 칼럼의 값들에 대한 시리즈
  • df[STR List] => 그 칼럼들만 가져온 데이터프레임
  • df[Series] => True인 Row들만 가져온 데이터프레임

In [43]:
a_df = a_df[["Name", "Age"]]
b_df = b_df[["Name", "Age"]]

In [45]:
b_df


Out[45]:
Name Age
0 B 회사 직원 (1) 33
1 B 회사 직원 (2) 26
  • pd.concat으로 인덱스 기준으로 상위 하위 개념 나눌 수 있다.

In [52]:
ab_df = pd.concat([a_df, b_df], keys=["KaKao", "Daum"])

In [53]:
ab_df.loc["KaKao"]   # 결과가 DataFrame 으로 나왔다.


Out[53]:
Name Age
0 A 회사 직원 (1) 30
1 A 회사 직원 (2) 29

In [56]:
a_df.loc[0]   #결과가 Series로 나온다. 원본 데이터 형태에 따라서 결과가 다르게 나온다.


Out[56]:
Name    A 회사 직원 (1)
Age              30
Name: 0, dtype: object

In [57]:
ab_df.loc["KaKao"].loc[0]


Out[57]:
Name    A 회사 직원 (1)
Age              30
Name: 0, dtype: object
  • 위에서 Row로 합치는 것을 했다.
  • 이제는 Column을 합치는 과정에 대해서. concat을 쓸 거야

In [65]:
name_email_df = pd.DataFrame([
        {
            "Name": "김기표",
            "Email": "kkp@gmail.com",
        },
        {
            "Name": "유영수",
            "Email": "yys@naver.com",
        }
    ])

address_df = pd.DataFrame([
        {
            "Address": "패캠 대기빌딩 김기표님 앞",
        },
        {
            "Address": "패캠 대기빌딩 유영수님 앞",
        }
    ])

In [66]:
name_email_df


Out[66]:
Email Name
0 kkp@gmail.com 김기표
1 yys@naver.com 유영수

In [67]:
address_df


Out[67]:
Address
0 패캠 대기빌딩 김기표님 앞
1 패캠 대기빌딩 유영수님 앞

In [68]:
name_email_df + address_df


Out[68]:
Address Email Name
0 NaN NaN NaN
1 NaN NaN NaN

In [69]:
pd.concat([name_email_df, address_df])


Out[69]:
Address Email Name
0 NaN kkp@gmail.com 김기표
1 NaN yys@naver.com 유영수
0 패캠 대기빌딩 김기표님 앞 NaN NaN
1 패캠 대기빌딩 유영수님 앞 NaN NaN
  • row를 기준으로 (즉 x축을 기준으로) concat을 한 것이다.
  • 이제는 column을 기준으로 ( y축을 기준으로) concat을 하도록 axis를 변경해줘야 한다.

In [70]:
pd.concat([name_email_df, address_df], axis=1)   #기본값으로 0, False가 들어가 있다.


Out[70]:
Email Name Address
0 kkp@gmail.com 김기표 패캠 대기빌딩 김기표님 앞
1 yys@naver.com 유영수 패캠 대기빌딩 유영수님 앞

In [73]:
pd.concat([name_email_df, address_df], axis=True)


Out[73]:
Email Name Address
0 kkp@gmail.com 김기표 패캠 대기빌딩 김기표님 앞
1 yys@naver.com 유영수 패캠 대기빌딩 유영수님 앞

In [74]:
name_email_df = pd.DataFrame([
        {
            "Name": "김기표",
            "Email": "kkp@naver.co.kr",
        },
        {
            "Name": "김기준",
            "Email": "sj@gmail.co.kr",
        }
    ])

address_df = pd.DataFrame([
        {
            "Address": "패캠 대기빌딩 김기표님 앞",
        },
        {
            "Address": "패캠 대기빌딩 김기준님 앞",
        },
        {
            "Address": "패캠 대기빌딩 김기상님 앞",
        }
    ])

In [75]:
pd.concat([name_email_df, address_df], axis=1)


Out[75]:
Email Name Address
0 kkp@naver.co.kr 김기표 패캠 대기빌딩 김기표님 앞
1 sj@gmail.co.kr 김기준 패캠 대기빌딩 김기준님 앞
2 NaN NaN 패캠 대기빌딩 김기상님 앞
  • pandas에서 for문을 돌리는 방법이 따로 있다.

In [77]:
ab_df = a_df.append(b_df).reset_index(drop=True)
ab_df


Out[77]:
Name Age
0 A 회사 직원 (1) 30
1 A 회사 직원 (2) 29
2 B 회사 직원 (1) 33
3 B 회사 직원 (2) 26

In [78]:
ab_df.iterrows()


Out[78]:
<generator object DataFrame.iterrows at 0x00000000094B7360>

In [81]:
for index, row in ab_df.iterrows():     #가능하면 for문 말고 다른 방법을 찾아보자.
    print(row)                          #row를 기준으로 iteration을 돈다.
    
# iterrows => 수작업으로 고생을 해서 구현을 하다가 => pandas내부기능으로 옮기는 작업을 할 예정이다.


Name    A 회사 직원 (1)
Age              30
Name: 0, dtype: object
Name    A 회사 직원 (2)
Age              29
Name: 1, dtype: object
Name    B 회사 직원 (1)
Age              33
Name: 2, dtype: object
Name    B 회사 직원 (2)
Age              26
Name: 3, dtype: object